from django.shortcuts import render
from django.http.response import HttpResponse

# Create your views here.
from book.models import BookInfo


def index(request):
    # 代码应该写在这里 我们要验证的话 每次都要 通过浏览器发送请求
    # 实现新增
    # BookInfo.objects.create()

    return HttpResponse('ok')


##############新增模型数据#################

# 方式1
from book.models import BookInfo

book = BookInfo(
    name='Python高级',
    pub_date='2020-1-1'
)
# 属性赋值
# book.name='Python高级'
# book.pub_date='2020-1-1'

# 一定要调用 save方法
book.save()

# 方式2
book = BookInfo.objects.create(
    name='django',
    pub_date='2020-02-01',
    readcount=666,
    commentcount=999
)
# from book.models import PeopleInfo
# PeopleInfo.objects.create()
# PeopleInfo.objects.update()
# PeopleInfo.objects.filter().delete()

# #################模型更新[修改]################

# 方式1
# update set xxx=newxxx where id=1

# 1.查询指定的数据
# select * from bookinfo where id=1
book = BookInfo.objects.get(id=1)

# 2.调用对象的属性=新值
book.name = '射雕英雄后后后传'
book.readcount = 120

# 3.保存数据的话 要调用save方法
book.save()

# 方式2
# select * from bookinfo where id=1
BookInfo.objects.filter(id=1).update(
    name='射雕英雄前前前传',
    pub_date='2020-01-01'
)
###########删除数据--物理删除[数据就真的没有了]###########
# 逻辑删除
# book.is_delete=True

# 方式1
# 先查询指定的数据
book = BookInfo.objects.get(id=1)
# 调用
book.delete()

# 方式2
BookInfo.objects.get(id=6).delete()
BookInfo.objects.filter(id=6).delete()
#####################基本查询###################

# 单一查询 一般都是通过id查询
BookInfo.objects.get(id=2)

# 查询所有
BookInfo.objects.all()

# 数量
BookInfo.objects.all().count()

# 我们通过get查询 如果查询对象不存在，系统会抛出异常
# 针对于异常我们要通过进行异常捕获
try:
    BookInfo.objects.get(id=1)
except Exception:
    print('没有查询到')

# 建议采用下边的形式
try:
    BookInfo.objects.get(id=1)
except BookInfo.DoesNotExist:
    print('DoesNotExist 异常')

# ######################where 过滤筛选查询###########

# Xxxx.objects.filter()
# Xxxx.objects.get()
# Xxxx.objects.exclude()
"""
where 语句
    filter过滤出多个结果
    exclude排除掉符合条件剩下的结果
    get过滤单一结果
以 filter 为例
语法形式： filter(属性__运算符=值)

"""
# 查询编号为1的图书
BookInfo.objects.get(id__exact=2)  # 完整写法
BookInfo.objects.get(id=2)  # 精简写法
BookInfo.objects.get(name='天龙八部')  # 属性 是什么都可以

BookInfo.objects.filter(id__exact=2)
# 查询书名包含'湖'的图书
BookInfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
# select * from bookinfo where id in (1,3,5)
BookInfo.objects.filter(id__in=[1, 3, 5])
# 查询编号大于3的图书

# gt 大于 (greater then)
# gte 大于等于 (greater then equal)
# lt 小于 (less then)
# lte 小于等于 (less then equal)
BookInfo.objects.filter(id__gt=3)
# 查询1980年发表的图书
BookInfo.objects.filter(pub_date__year=1980)
# 查询1990年1月1日后发表的图书
BookInfo.objects.filter(pub_date__gte='1990-01-01')

# exclude not
# 查询id不等于3
BookInfo.objects.exclude(id=3)
##############F对象#################################
# 例：查询阅读量大于等于评论量的图书

from django.db.models import F

# 语法形式是：模型类名.objects.filter(属性名__运算符=F('属性名'))
BookInfo.objects.filter(readcount__gte=F('commentcount'))

#################Q对象########################

# 查询书籍id大于2 并且 阅读量大于30的书籍
BookInfo.objects.filter(id__gt=2).filter(readcount__gt=30)
# 或者
BookInfo.objects.filter(id__gt=2, readcount__gt=30)
# 或者
from django.db.models import Q

# & 并且
# | 或者
# - 非(not) 和 exclude 很类似
# 语法形式：Q(属性名__运算符=值)

BookInfo.objects.filter(Q(id__gt=2) & Q(readcount__gt=30))
# 查询书籍id大于2 或者 阅读量大于30的书籍
BookInfo.objects.filter(Q(id__gt=2) | Q(readcount__gt=30))

# exclude not
# 查询id不等于3
BookInfo.objects.exclude(id=3)
BookInfo.objects.filter(~Q(id=3))

##################聚合函数################
from django.db.models import Sum, Max, Min, Avg, Count

# 模型类名.objects.aggregate(Xxxxx('字段'))
BookInfo.objects.aggregate(Sum('readcount'))
####################排序####################
BookInfo.objects.all().order_by('readcount')  # 升序(默认)
BookInfo.objects.all().order_by('-readcount')  # 降序
#################2个表的 关联查询#######################
# 查询书籍为1的所有人物信息
from book.models import PeopleInfo

PeopleInfo.objects.filter(book_id=2)

# 根据书籍找人物
# 1.把书籍查询出来
book = BookInfo.objects.get(id=2)
# 2.把人物查询出来
book.peopleinfo_set.all()

# 查询人物为6的书籍信息
BookInfo.objects.get(peopleinfo__id=6)

# 1.先查询人物
person = PeopleInfo.objects.get(id=6)
# 2.根据人物 再获取书籍
person.book
###################################
# 查询图书，要求图书人物为"郭靖"
BookInfo.objects.filter(peopleinfo__name='东方不败')

# 查询图书，要求图书中人物的描述包含"八"
#           1               n
# 最终的结果是 图书 查询条件是 人物
# 模型类名.objects.filteer(关联模型类名小写__属性名__运算符=值)

BookInfo.objects.filter(peopleinfo__description__contains='八')

######################################
# 查询图书阅读量大于30的所有人物
PeopleInfo.objects.filter(book__readcount__gt=30)
# 查询书名为“天龙八部”的所有人物
PeopleInfo.objects.filter(book__name='天龙八部')

#############分页#####################################
# 1.导入分页类
from django.core.paginator import Paginator

# 2. 组织列表数据
book = BookInfo.objects.all()
# 3. 创建分页对象
# object_list,      列表
# per_page          每页多少条数据
p = Paginator(book, per_page=2)

# 4. 获取第几页数据
page_objects = p.page(1)

# 总共多少页
p.num_pages

# 要分页的数据
page_objects.object_list
